import { ref } from 'vue';

export function useTencentCaptchaVerify(){

  const getCodeCallBack = ref(null);

  const { tencentCaptchaAppID } = getApp().globalData

  // 点击获取验证码前校验
  const handleBeforeGetCode = (callback) => {

    getCodeCallBack.value = callback

    // 调用腾讯滑动验证
    // #ifdef MP-WEIXIN
    const pages = getCurrentPages();  // 用于获取当前页面栈的实例，以数组形式按栈的顺序给出，第一个元素为首页，最后一个元素为当前页面
    pages[pages.length - 1]?.selectComponent('#captcha')?.show(); //显示验证调用handlerMiniCaptchaVerify
    // #endif

    // #ifdef H5
    // 必须动态引入验证码 JS。如通过其他手段规避动态加载，会导致验证码无法正常更新，对抗能力无法保证，甚至引起误拦截。
    if(!window?.TencentCaptcha) {
      const TCaptchaScript = document.createElement('script');
      TCaptchaScript.type = 'text/javascript';
      TCaptchaScript.src = 'https://ssl.captcha.qq.com/TCaptcha.js';
      document.head.appendChild(TCaptchaScript);
      TCaptchaScript.onload = function(){
        h5TencentCaptchaShow();
      };
    } else {
      h5TencentCaptchaShow();
    }
    // #endif

  }

  // #ifdef MP-WEIXIN
  // 小程序滑动验证码验证结果回调
  const handlerMiniCaptchaVerify = (ev) => {
    // 如果使用了 mpvue，ev.detail 需要换成 ev.mp.detail
    if(ev.detail.ret === 0) {
      // 验证成功
      getCodeCallBack.value({ ticket: ev.detail.ticket })
    }
  }
  // #endif

  // #ifdef H5
  // h5腾讯滑块验证
  const h5TencentCaptchaShow = () => {
    try {
      const h5Captcha = new TencentCaptcha(tencentCaptchaAppID, h5TencentCaptchaCallback, {});
      // 调用方法，显示验证码
      h5Captcha.show(); 
    } catch (error) {
      // 加载异常，调用验证码js加载错误处理函数
      h5TencentCaptchaLoadErrorCallback();
    }
  };

  const h5TencentCaptchaCallback = (res) => {
    // 当且仅当验证成功(ret=0)时ticket 有值。
    if (res.ret === 0) {
      getCodeCallBack.value({ ticket: res.ticket })
    }
  };
  
  const h5TencentCaptchaLoadErrorCallback = () => {
    // 生成容灾票据
    const ticket = 'terror_1001_' + tencentCaptchaAppID + '_' + Math.floor(new Date().getTime() / 1000);
    callback({
      ret: 0,
      randstr: '@'+ Math.random().toString(36).substr(2),
      ticket: ticket,
      errorCode: 1001,
      errorMessage: 'jsload_error'
    });
  }
  // #endif

  return { 
    handleBeforeGetCode,
    // #ifdef MP-WEIXIN
    handlerMiniCaptchaVerify
    // #endif
  }
}